package com.dhcc.DRGsHosp.application.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.inject.Named;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import com.dhcc.DRGsHosp.application.MrqDictDetailApplication;
import com.dhcc.DRGsHosp.core.domain.MrqDictDetail;
import com.dhcc.DRGsHosp.infra.util.MonitorResultUtil;

/**
 * 得分项目的字典表   的数据访问层--实体类
 * @ClassName: MrqDictDetailApplicationImpl  
 * @Description ：得分项目的字典表    
 * @Date: 2018年7月27日 上午9:08:46  
 * @Author QiaoYiLong 
 * @Version 3.1.1 DHC-DRG
 */

@Named("drgsMrqDictDetailApplicationImpl20190103")
@Transactional
public class MrqDictDetailApplicationImpl implements MrqDictDetailApplication {
	
	@Autowired  
	private NamedParameterJdbcTemplate jdbcTempSeverice;
	
	/**
	 *  功能描述：依据 得分项目编码 查找与其对应的一个得分项目的字典表   
	 *  @Author QiaoYiLong
	 *  @param detailCode  得分项目编码
	 *  @Date:2018年7月27日上午8:56:59
	 */
	@Override
	public MrqDictDetail getMrqDictDetail(String detailCode) {
		return MrqDictDetail.get(MrqDictDetail.class, detailCode);
	}
	/**
	 *  功能描述：创建一个得分项目的字典表   
	 *  @Author QiaoYiLong 
	 *  @Date:2018年7月27日上午8:58:02
	 */
	@Override
	public void createMrqDictDetail(MrqDictDetail mrqDictDetail) {
		mrqDictDetail.save();
	}
	/**
	 *  功能描述：修改一个得分项目的字典表
	 *  @Author QiaoYiLong
	 *  @Date:2018年7月27日上午8:59:39
	 */	
	@Override
	public void updateMrqDictDetail(MrqDictDetail mrqDictDetail) {
		mrqDictDetail.save();
	}
	/**
	 *  功能描述：删除一个得分项目的字典表   
	 *  @Author QiaoYiLong
	 *  @Date:2018年7月27日上午9:01:52
	 */
	@Override
	public void removeMrqDictDetail(MrqDictDetail mrqDictDetail) {
		if( mrqDictDetail != null ){
			mrqDictDetail.remove();
		}		
	}
	/**
	 *  功能描述：删除多个 得分项目的字典表   
	 *  @Author QiaoYiLong
	 *  @Date:2018年7月27日上午9:01:59
	 */
	@Override
	public void removeMrqDictDetails(Set<MrqDictDetail> mrqDictDetails) {
		for(MrqDictDetail mrqDictDetail: mrqDictDetails){
			if( mrqDictDetail != null ){
				mrqDictDetail.remove();
			}
		}
	}
	/**
	 *  功能描述：取得所有的 得分项目的字典表   信息
	 *  @Author QiaoYiLong
	 *  @Date:2018年7月27日上午9:02:31
	 */
	@Override
	public List<MrqDictDetail> findAllMrqDictDetail() {
		return MrqDictDetail.findAll(MrqDictDetail.class);
	}
	/**
	 *  功能描述： 根据scoreCode（四大类分项编码）取得该分项对应的所有得分项目字典信息
	 *  @param scoreCode
	 *  @Date:2018年8月7日下午2:21:02
	 */
	@Override
	public List<Map<String, Object>> getShowTableInfoByScoreCode(String scoreCode){

		if(scoreCode == null || "".equals(scoreCode)){
			return new ArrayList<Map<String, Object>>(); 
		}
		scoreCode = "'"+scoreCode;
		scoreCode = scoreCode.replace("@@", "','");	
		if(scoreCode.lastIndexOf(",'") == scoreCode.length()-2){
			scoreCode = scoreCode.substring(0, scoreCode.length()-2);
		}
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT weight.score_code ,weight.WEIGHT_CODE,weight.WEIGHT_NAME,weight.WEIGHT_SCORE,detail.DETAIL_CODE, \n ");
		sql.append(" detail.DETAIL_NAME,detail.DETAIL_SCORE,detail.VALID_FLAG \n ");
		sql.append(" FROM DRGS.MRQ_DICT_WEIGHT weight LEFT JOIN DRGS.MRQ_DICT_DETAIL detail \n ");
		sql.append(" ON weight.SCORE_CODE = detail.SCORE_CODE and weight.WEIGHT_CODE = detail.WEIGHT_CODE  \n ");
		sql.append(" WHERE weight.SCORE_CODE in ("+scoreCode+") \n ");
		sql.append(" ORDER BY weight.score_code ,weight.WEIGHT_CODE,detail.DETAIL_CODE \n ");
		Map<String,Object> paramMap = new HashMap<String,Object>();
		return jdbcTempSeverice.queryForList(sql.toString(), paramMap);	
	}
	/**
	 *  功能描述：根据主键值detailCode修改字段field的值
	 *  @Author QiaoYiLong
	 *  @param detailCode 主键
	 *  @param field  字段名称
	 *  @param value  字段值
	 *  @return sql执行成功修改的数据条数
	 *  @Date:2018年8月9日下午2:37:30
	 */
	@Override
	public int modifyField(String detailCode,String field,String value){
		String sql = "UPDATE DRGS.MRQ_DICT_DETAIL detail SET detail."+field+" = :value WHERE detail.DETAIL_CODE = :detailCode ";
		Map<String,Object> paramMap = new HashMap<String,Object>();
		paramMap.put("value", value);
		paramMap.put("detailCode", detailCode);
//		System.out.println("field:"+field+" value:"+value+" detailCode:"+detailCode);
		int count =  jdbcTempSeverice.update(sql, paramMap);

		return count;
	}
	
	/**
	 *  功能描述： 取得MRQ_DICT_SCORE表的所有大类信息
	 *  @param hospName 医院名称
	 *  @Date:2018年12月26日下午4:21:02
	 */
	@Override
	public List<Map<String, Object>> getAllMrqDictScore(String hospName){
		List<Map<String, Object>> list =  new ArrayList<Map<String, Object>>();
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT distinct ds.SCORE_CODE,ds.SCORE_NAME,ds.SCORE_SCORE \n ");
		sql.append(" FROM DRGS.MRQ_DICT_SCORE ds  \n ");
		sql.append(" WHERE 1=1 and instr('"+hospName+"',ds.HOSP_NAME)>0 \n ");
		sql.append(" ORDER BY ds.SCORE_SORT  \n ");
		Map<String,Object> paramMap = new HashMap<String,Object>();
		list = jdbcTempSeverice.queryForList(sql.toString(), paramMap);	
		return list;
	}
	/**
	 * @Description: 查询质控规则对应的分数
	 * @param hospName 医院名称
	 * @author qiaoyilong
	 * @date 2019/1/3 20:23
	 */
	@Override
	public Map<String,Double> findDetailScore(String hospName) {
		// 规则-质控项
		Map<String,Double> ruleDetail = new HashMap<String,Double>() ;
		StringBuffer sqlb = new StringBuffer() ;
		sqlb.append(" select dt.detail_code,dt.detail_score \n") ;
		sqlb.append(" from drgs.MRQ_DICT_DETAIL dt \n") ;
		sqlb.append(" left join drgs.MRQ_DICT_WEIGHT dw on dw.score_code = dt.score_code and dw.weight_code = dt.weight_code \n") ;
		sqlb.append(" left join drgs.MRQ_DICT_SCORE ds on ds.score_code = dw.score_code and instr('"+hospName+"',ds.hosp_name)>0 \n") ;
		Map<String,Object> paramMap = new HashMap<String,Object>();
		List<Map<String,Object>> resultList = jdbcTempSeverice.queryForList(sqlb.toString(), paramMap) ;
		for (Map<String,Object> map:resultList) {
			ruleDetail.put(MonitorResultUtil.object2String(map.get("DETAIL_CODE")),MonitorResultUtil.objectToDouble(map.get("DETAIL_SCORE"))) ;
		}
		return ruleDetail;
	}
}
